#ifndef QQMUSIC_H
#define QQMUSIC_H

#include <QWidget>
#include "volumetool.h"
#include "musiclist.h"
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include "commonpage.h"
#include "lrcpage.h"
#include <QPropertyAnimation>
#include <QSqlDatabase>

QT_BEGIN_NAMESPACE
namespace Ui { class QQMusic; }
QT_END_NAMESPACE

class QQMusic : public QWidget
{
    Q_OBJECT

public:
    QQMusic(QWidget *parent = nullptr);
    ~QQMusic();

    //界面初始化
    void initUI();
    //初始化数据库
    void initSqlite();
    //初始化歌曲列表MusicList
    void initMusicList();
    //初始化媒体播放相关操作
    void initPlayer();
    //内部添加所有的信号和槽函数的连接函数
    void connectSignalAndSlots();
    //管理图片的推荐文本和图片 RecBoxItem元素
    QJsonArray randomPiction();
    //更新BtForm按钮上的动画
    void updateBtformAnimal();
    //让程序退出
    void onQQMusicQuit();
protected:
    //鼠标点击事件的事件处理函数
    void mousePressEvent(QMouseEvent *event);
    //鼠标移动事件的事件处理函数
    void mouseMoveEvent(QMouseEvent *event);

private slots:
    //点击关闭按钮的槽函数
    void on_quit_clicked();
    //响应BtForm按钮btClick点击信号的槽函数。参数：点击按钮的id值
    void onBtFormClick(int pageId);

    void on_volume_clicked();

    void on_addLocal_clicked();

    //点击词按钮后的槽函数
    void onLrcWordClicked();

    //收藏按钮已点击-更新我喜欢、本地下载、最近播放三个page页面所管理的Music列表信息
    void updateLikeMusicAndPage(bool isLike, const QString& musicId);

    //播放控制区的槽函数
    //点击播放按钮的槽函数-歌曲在播放和暂停之间进行切换
    void onPlayMusic();

    //当播放按钮状态改变时的槽函数
    //QMediaPlayer中stateChanged信号对应的槽函数
    void onPlayerStateChanged();

    //点击上一曲按钮的槽函数
    void onplayUpClicked();
    //点击下一曲按钮的槽函数
    void onplayDownClicked();
    //播放模式设置[随机播放、循环列表播放、单曲循环播放]
    void onPlaybackModeClicked();
    //当播放模式切换时的槽函数[随机播放、循环列表播放、单曲循环播放]之间互相切换时
    void onPlaybackModeChanged(QMediaPlaylist::PlaybackMode playbackMode);
    //点击播放所有按钮发射信号对应的槽函数
    void onPlayAll(PageType pageType);
    //播放page页面的播放列表中的音乐,从第index首开始播放
    void playAllMusicOfCommonPage(CommonPage* page,int index);
    //双击page页面中的音乐项时，void playMusicByIndex(CommonPage*,int)信号的槽函数，播放指定page页地址所处下标的音乐
    void playMusicByIndex(CommonPage* page,int index);

    //当播放的音乐的下标发生改变时，触发信号的槽函数 index就是正在播放的音乐的下标
    //playlist中播放源发生改变时，index表示正在播放的媒体的索引
    void onCurrentIndexChanged(int index);
    //媒体静音设置的自定义信号的槽函数-volimeTool类中setMusicMuted信号对应的槽函数
    void setPlayerMuted(bool isMuted);
    //发送音量大小需要调整信号的槽函数-volumnTool类中setMusicVolumn信号对应的槽函数
    void setPlayerVolume(int volume);
    //当媒体源播放内容发生改变时对应信号的槽函数-播放媒体切换，播放时间也会改变
    void onDurationChanged(qint64 duration);//参数：正在播放的音乐的总时长
    //播放进度发生改变时信号对应的槽函数
    void onPositionChanged(qint64 position);//参数：当前的时间点(当前已经播放的时长)
    //进度条位置发生改变时的自定义信号，改变当前播放的音乐的进度的槽函数-进度条改变需要播放时间跟着进行修改
    void onMusicSliderChanged(float ration);
    //当媒体源发生改变时的槽函数-用于进行歌曲图片、歌手、专辑信息在播放控制区的加载 available表示元数据是否有效
    void onMetaDataAvailableChanged(bool available);




    void on_skin_clicked();

    void on_min_clicked();

    void on_max_clicked();

private:
    Ui::QQMusic *ui;
    QPoint dragPosition;//鼠标相对于窗口左上角的相对位置。
    QSqlDatabase sqlite;//数据库对象
    MusicList musicList; //程序用来组织歌曲文件
    VolumeTool *volumeTool;//音量按钮
    LrcPage* lrcPage;//lrc歌词界面
    QPropertyAnimation *lrcPageAnimal;//lrc歌曲界面上移动画属性
    QMediaPlayer *player;//媒体播放类-专门用来播放控制
    QMediaPlaylist *playList;//播放列表-战门用来管理播放源，包含一些播放模式设置等
    CommonPage *currentPage;//记录当前正在播放的page页面[我喜欢、本地下载、最近播放]
    qint64 totalTime;//记录媒体源的总时间
    int currentIndex;//当前播放的音乐在媒体列表中的索引
    bool isDrag;//是否拖拽
};
#endif // QQMUSIC_H
